home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / tcp_ip / tnos / tnos100s / search.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-13  |  2.0 KB  |  109 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <io.h>
  4.  
  5. int searchfileFP (searchfor, fp, buf, entrysize, passes, searchlen)
  6. register char *searchfor;
  7. register FILE *fp;
  8. register char *buf;
  9. int entrysize, *passes, searchlen;
  10. {
  11. long size;
  12. register int start, result, found = 0;
  13. int index;
  14. char *cp;
  15. register int low = 0, high;
  16.  
  17.     if (passes)
  18.         *passes = 0;
  19.     if (!searchlen)
  20.         searchlen = strlen (searchfor);
  21.     size = filelength (fileno(fp));
  22.     size /= entrysize;
  23.     high = size - 1;
  24.     index = start = size / 2;
  25.     for ( ; ; )    {
  26.         pwait (NULL);
  27.         fseek (fp, (long) ((long)index * (long)entrysize), 0);
  28.         fread (buf, 1, entrysize, fp);
  29.         if (passes)
  30.             (*passes)++;
  31.         cp = strpbrk (buf, ".@ \t");
  32.         if (cp)
  33.             *cp = 0;
  34.         result = strnicmp (searchfor, buf, searchlen);
  35.         if (!result)    {
  36.             found = 1;
  37.             break;
  38.         }
  39.         if (start != 1)
  40.             start /= 2;
  41.         if (result < 0)    {
  42.             high = index - 1;
  43.             index -= start;
  44.         } else    {
  45.             low = index + 1;
  46.             index += start;
  47.         }
  48.         if (index < low || index > high)
  49.             break;
  50.     }
  51.     if (found)    {        /* refresh it */
  52.         fseek (fp, (long) ((long)index * (long)entrysize), 0);
  53.         fread (buf, 1, entrysize, fp);
  54.     }
  55.     return ((found) ? index : -1);
  56. }
  57.  
  58.  
  59.  
  60. int searchfile (searchfor, fname, buf, entrysize, passes, searchlen)
  61. register char *searchfor;
  62. char *fname;
  63. register char *buf;
  64. int entrysize, *passes, searchlen;
  65. {
  66. int result;
  67. FILE *fp;
  68.  
  69.     if ((fp = fopen (fname, "rb")) == NULL)
  70.         return (-1);
  71.     result = searchfileFP (searchfor, fp, buf, entrysize, passes, searchlen);
  72.     fclose (fp);
  73.     return (result);    
  74. }
  75.  
  76.  
  77.  
  78. #ifdef DEMO
  79. #define ENTRYSIZE 49
  80.  
  81. int
  82. pwait (i)
  83. int i;
  84. {
  85.     return i;
  86. }
  87.  
  88.  
  89. void
  90. main (argc, argv)
  91. int argc;
  92. char *argv[];
  93. {
  94. int found, passes;
  95. char buf[128], *searchfor;
  96.  
  97.     searchfor = "kp4djt";
  98.     if (argc > 1)
  99.         searchfor = argv[1];
  100.     found = searchfile (searchfor, "/nos/spool/wpagebbs", buf, ENTRYSIZE, &passes);
  101.  
  102.     printf ("String '%s' %sfound - %d passes\n", searchfor, (found == -1) ? "NOT " : "", passes);
  103.     if (found != -1)    {
  104.         buf[ENTRYSIZE] = 0;
  105.         puts (buf);
  106.     }
  107. }
  108. #endif
  109.